package demo6;

import java.util.ArrayList;
import java.util.Random;

/**
 * 抽奖器
 * @param <T>
 */
public class ProductGetter <T> {
    Random random = new Random();
    //1、奖品
    private T product;
    //2、奖品池
    ArrayList<T> list = new ArrayList<>();

    //3、添加奖品
    public void addProduct(T t) {
        // 数组中添加数据的方法 list.add()
        list.add(t);
    }

//    //demo3里用泛型类做的抽奖器
//    //4、抽奖,用泛型类创建的对象的普通的get方法
//    public T getProduct() {
//        // 获取数组元素的方法 list.get()
//        product = list.get(random.nextInt(list.size()));
//        return product;
//    }


    //4、抽奖，用泛型方法获取数据
    /**
     * 定义泛型方法
     * @param list 参数
     * @return
     * @param <E> 泛型标识，具体类型由调用方法的时候指定
     */
    public <E> E getProduct(ArrayList<E> list) {
        return list.get(random.nextInt(list.size()));
    }

    /**
     * 静态泛型方法
     * @param t
     * @param e
     * @param k
     * @param <T>
     * @param <E>
     * @param <K>
     */
    public static <T,E,K> void printType(T t, E e, K k) {
        System.out.println(t + "\t" + t.getClass().getSimpleName());
        System.out.println(e + "\t" + e.getClass().getSimpleName());
        System.out.println(k + "\t" + k.getClass().getSimpleName());

    }

    /**
     * 泛型可变参数的定义
     * @param e
     * @param <E>
     */
    public <E> void print(E... e) {
        for (int i = 0; i < e.length; i++) {
            System.out.println(e[i]);
        }
    }


    /**
     * 静态泛型方法可变参数的定义
     * @param k
     * @param <K>
     */
    public static <K> void printf(K... k) {
        for (int i = 0; i < k.length; i++) {
            System.out.println(k[i]);
        }
    }
}